package com.xiongjie.SingleLimit.algorithm;

/**
 * 使用漏桶算法实现限流功能。算法伪代码
 * <p>
 * 桶算法必须要有两个线程，一个模拟发送请求，一个从漏桶取出请求继续执行
 * 推荐组合：并发队列做漏桶 + 定时任务自动从漏桶取出请求+RateLimiter。因为漏桶里面存储的是请求，后续需要使用
 */
public class LBLimiterWithPseudocode {

    long timeStamp = System.currentTimeMillis();
    int capacity = 100; // 桶的容量
    int rate = 10; //水漏出的速度
    int water; //当前水量

    boolean grant() {
        //先执行漏水，因为rate是固定的，所以可以认为“时间间隔*rate”即为漏出的水量
        long now = System.currentTimeMillis();
        water = (int) Math.max(0, water - (now - timeStamp) * rate);    //这里的water请求会在用户点击下不停的增加，代码看不出来
        timeStamp = now;

        if (water < capacity) { //水还未满，加水
            water++;

            //这里只是单纯的漏桶加水操作，也就是请求是否通过操作，有另外的线程专门从漏桶取数据继续执行请求

            return true;
        } else {
            return false;//水满，拒绝加水
        }
    }

}
